


(function ($, flash, Plugin) {
    var OBJECT = "object", ENCODE = true;
    function _compareArrayIntegers(a, b) {
        var x = (a[0] || 0) - (b[0] || 0);
        return x > 0 || (!x && a.length > 0 && _compareArrayIntegers(a.slice(1), b.slice(1)));
    }
    function _objectToArguments(obj) {
        if (typeof obj != OBJECT) {
            return obj;
        }
        var arr = [], str = "";
        for (var i in obj) {
            if (typeof obj[i] == OBJECT) {
                str = _objectToArguments(obj[i]);
            } else {
                str = [i, (ENCODE) ? encodeURI(obj[i]) : obj[i]].join("=");
            }
            arr.push(str);
        }
        return arr.join("&");
    }
    function _objectFromObject(obj) {
        var arr = [];
        for (var i in obj) {
            if (obj[i]) {
                arr.push([i, "=\"", obj[i], "\""].join(""));
            }
        }
        return arr.join(" ");
    }
    function _paramsFromObject(obj) {
        var arr = [];
        for (var i in obj) {
            arr.push(["<param name=\"", i, "\" value=\"", _objectToArguments(obj[i]), "\" />"].join(""));
        }
        return arr.join("");
    }
    try {
        var flashVersion = Plugin.description || (function () {
            return (new Plugin("ShockwaveFlash.ShockwaveFlash")).GetVariable("$version");
        }());
    }
    catch (e) {
        flashVersion = "Unavailable";
    }
    var flashVersionMatchVersionNumbers = flashVersion.match(/\d+/g) || [0];
    $[flash] = {available:flashVersionMatchVersionNumbers[0] > 0, activeX:Plugin && !Plugin.name, version:{original:flashVersion, array:flashVersionMatchVersionNumbers, string:flashVersionMatchVersionNumbers.join("."), major:parseInt(flashVersionMatchVersionNumbers[0], 10) || 0, minor:parseInt(flashVersionMatchVersionNumbers[1], 10) || 0, release:parseInt(flashVersionMatchVersionNumbers[2], 10) || 0}, hasVersion:function (version) {
        var versionArray = (/string|number/.test(typeof version)) ? version.toString().split(".") : (/object/.test(typeof version)) ? [version.major, version.minor] : version || [0, 0];
        return _compareArrayIntegers(flashVersionMatchVersionNumbers, versionArray);
    }, encodeParams:true, expressInstall:"expressInstall.swf", expressInstallIsActive:false, create:function (obj) {
        var instance = this;
        if (!obj.swf || instance.expressInstallIsActive || (!instance.available && !obj.hasVersionFail)) {
            return false;
        }
        if (!instance.hasVersion(obj.hasVersion || 1)) {
            instance.expressInstallIsActive = true;
            if (typeof obj.hasVersionFail == "function") {
                if (!obj.hasVersionFail.apply(obj)) {
                    return false;
                }
            }
            obj = {swf:obj.expressInstall || instance.expressInstall, height:137, width:214, flashvars:{MMredirectURL:location.href, MMplayerType:(instance.activeX) ? "ActiveX" : "PlugIn", MMdoctitle:document.title.slice(0, 47) + " - Flash Player Installation"}};
        }
        attrs = {data:obj.swf, type:"application/x-shockwave-flash", id:obj.id || "flash_" + Math.floor(Math.random() * 999999999), width:obj.width || 320, height:obj.height || 180, style:obj.style || ""};
        ENCODE = typeof obj.useEncode !== "undefined" ? obj.useEncode : instance.encodeParams;
        obj.movie = obj.swf;
        obj.wmode = obj.wmode || "opaque";
        delete obj.fallback;
        delete obj.hasVersion;
        delete obj.hasVersionFail;
        delete obj.height;
        delete obj.id;
        delete obj.swf;
        delete obj.useEncode;
        delete obj.width;
        var flashContainer = document.createElement("div");
        flashContainer.innerHTML = ["<object ", _objectFromObject(attrs), ">", _paramsFromObject(obj), "</object>"].join("");
        return flashContainer.firstChild;
    }};
    $.fn[flash] = function (options) {
        var $this = this.find(OBJECT).andSelf().filter(OBJECT);
        if (/string|object/.test(typeof options)) {
            this.each(function () {
                var $this = $(this), flashObject;
                options = (typeof options == OBJECT) ? options : {swf:options};
                options.fallback = this;
                flashObject = $[flash].create(options);
                if (flashObject) {
                    $this.children().remove();
                    $this.html(flashObject);
                }
            });
        }
        if (typeof options == "function") {
            $this.each(function () {
                var instance = this, jsInteractionTimeoutMs = "jsInteractionTimeoutMs";
                instance[jsInteractionTimeoutMs] = instance[jsInteractionTimeoutMs] || 0;
                if (instance[jsInteractionTimeoutMs] < 660) {
                    if (instance.clientWidth || instance.clientHeight) {
                        options.call(instance);
                    } else {
                        setTimeout(function () {
                            $(instance)[flash](options);
                        }, instance[jsInteractionTimeoutMs] + 66);
                    }
                }
            });
        }
        return $this;
    };
}(jQuery, "flash", navigator.plugins["Shockwave Flash"] || window.ActiveXObject));

